{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### $J(\\theta) + \\alpha L_2  ----> C\\cdot J(\\theta)+L_2$\n",
    "#### $J(\\theta) + \\alpha L_1  ----> C\\cdot J(\\theta)+L_1$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(666)\n",
    "X = np.random.normal(0, 1, size=(200,2))\n",
    "y = np.array((X[:,0]**2 + X[:,1])<1.5, dtype='int')\n",
    "for _ in range(20):\n",
    "    y[np.random.randint(200)] = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165c215da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用scikit-learn中的逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg = LogisticRegression()\n",
    "log_reg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7933333333333333"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.score(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.86"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_decision_boundary(model, axis):\n",
    "    x0, x1 = np.meshgrid(\n",
    "        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)),\n",
    "        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100))\n",
    "    )\n",
    "    x_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "    \n",
    "    y_predict = model.predict(x_new)\n",
    "    zz = y_predict.reshape(x0.shape)\n",
    "    from matplotlib.colors import ListedColormap\n",
    "    custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])\n",
    "    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\fangyang\\Anaconda3\\lib\\site-packages\\matplotlib\\contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n",
      "  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165b40cb70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(log_reg, axis=[-4,4,-4,4])\n",
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用多项式进行逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 给逻辑回归添加多项式项\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "def PolynomialLogisticRegression(degree):\n",
    "    return Pipeline([\n",
    "        ('poly', PolynomialFeatures(degree=degree)),\n",
    "        ('std_scaler', StandardScaler()),\n",
    "        ('log_reg', LogisticRegression())\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pipeline(memory=None,\n",
       "     steps=[('poly', PolynomialFeatures(degree=2, include_bias=True, interaction_only=False)), ('std_scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('log_reg', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False))])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg = PolynomialLogisticRegression(degree=2)\n",
    "poly_log_reg.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9133333333333333"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg.score(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.94"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg.score(X_test,y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\fangyang\\Anaconda3\\lib\\site-packages\\matplotlib\\contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n",
      "  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165e426c88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(poly_log_reg, axis=[-4,4,-4,4])\n",
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pipeline(memory=None,\n",
       "     steps=[('poly', PolynomialFeatures(degree=20, include_bias=True, interaction_only=False)), ('std_scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('log_reg', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False))])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg2 = PolynomialLogisticRegression(degree=20)\n",
    "poly_log_reg2.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.94"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg2.score(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg2.score(X_test,y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\fangyang\\Anaconda3\\lib\\site-packages\\matplotlib\\contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n",
      "  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165e4266d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(poly_log_reg2, axis=[-4,4,-4,4])\n",
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 改变超参数 C 来看下变化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def PolynomialLogisticRegression(degree, C):\n",
    "    return Pipeline([\n",
    "        ('poly', PolynomialFeatures(degree=degree)),\n",
    "        ('std_scaler', StandardScaler()),\n",
    "        ('log_reg', LogisticRegression(C=C))\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pipeline(memory=None,\n",
       "     steps=[('poly', PolynomialFeatures(degree=20, include_bias=True, interaction_only=False)), ('std_scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('log_reg', LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False))])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将 损失函数系数 默认的C由1减小到0.1, 相当于增加了L2的影响程度\n",
    "poly_log_reg3 = PolynomialLogisticRegression(degree=20, C=0.1)\n",
    "poly_log_reg3.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8533333333333334"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg3.score(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg3.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\fangyang\\Anaconda3\\lib\\site-packages\\matplotlib\\contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n",
      "  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165de1c3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(poly_log_reg3, axis=[-4,4,-4,4])\n",
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 改变正则项 L2 -> L1 看下变化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def PolynomialLogisticRegression(degree, C, penalty='l2'):\n",
    "    return Pipeline([\n",
    "        ('poly', PolynomialFeatures(degree=degree)),\n",
    "        ('std_scaler', StandardScaler()),\n",
    "        ('log_reg', LogisticRegression(C=C, penalty=penalty))\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pipeline(memory=None,\n",
       "     steps=[('poly', PolynomialFeatures(degree=20, include_bias=True, interaction_only=False)), ('std_scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('log_reg', LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l1', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False))])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg4 = PolynomialLogisticRegression(degree=20, C=0.1, penalty='l1')\n",
    "poly_log_reg4.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8266666666666667"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg4.score(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly_log_reg4.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\fangyang\\Anaconda3\\lib\\site-packages\\matplotlib\\contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n",
      "  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1165e0d9940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(poly_log_reg4, axis=[-4,4,-4,4])\n",
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
